Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.01.2020, 12:08
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 01.07.2017
Сообщений: 25

AJAX отказывается принимать JSON с ключами
Доброго времени суток!
Проблема такая... В js файле ajax должен принять JSON от php, но error: function (jqXHR, exception) {} выдает что exception = parsererror.

Но не всегда...

Если я в php задаю массив:
$arr = array(1,2,3,4,5);
echo json_encode($arr);

в js я получаю data:
success: function(data){
   console.log(data);
}

И в консоль спокойно выводится [1, 2, 3, 4, 5].


Но если я в php задаю массив с ключами то ничего не работает.
Беру пример 1 прямо с https://www.php.net/manual/ru/function.json-encode.php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);

Срабатывает не success, а error.

Если я вручную зайду на php, скопирую echo json_encode($arr), и вобью его на json decode online, то он нормально отработает. Т.е. проблема не в самом json, а в ajax получается...

Подскажите почему такое происходит и как получать через json массив с ключами.
Ответить с цитированием
  #2 (permalink)  
Старый 03.01.2020, 19:03
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 01.07.2017
Сообщений: 25

Та не...
Не работает даже так:
$(document).ready(function(){
	$.ajax({
        url:"url.php",
        type:"POST",
        dataType:"JSON",
        success: function(data){
            console.log(data);
        },
        error:function(e,t){
        	console.log(e);
        	console.log(t);
        }
	})
})

<?php
	$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
	echo json_encode($arr);
?>

И все. Больше ничего в коде нет. Если запустить это просто на сайте, то все конечно же работает, но если сделать это из расширения, то сразу срабатывает error. Притом опять же
<?php
	$arr = array(1,2,3,4,5);
	echo json_encode($arr);
?>

работает как и должен.
Полагаю это какое-то ограничение в расширениях для браузера...
Пол дня с этим копаюсь и так ничего и не придумал. Ладно если что нарою отпишу...
Ответить с цитированием
  #3 (permalink)  
Старый 03.01.2020, 19:11
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,598

Если parsererror, значит в ответе либо какой-то мусор добавлен, либо ответ вообще не тот, либо соединение рвётся раньше чем будет передан весь объект.
Вы откройте консоль и посмотрите что там в ответе на самом деле.
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 03.01.2020, 19:24
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 01.07.2017
Сообщений: 25

Если вручную зайти на php то там будет только:
{"a":1,"b":2,"c":3,"d":4,"e":5}
а в консоли я ничего не вижу. Где стоит поискать? В объекте error:function(e)?

readyState: 4
responseText: ""
state: ƒ ()
status: 200
statusCode: ƒ (e)
statusText: "OK"

Я так полагаю, что ответ приходит пустым... А как такое возможно, что массив без ключей отправляется нормально, а с ключами режется под 0?

Последний раз редактировалось Xopc11, 03.01.2020 в 19:31.
Ответить с цитированием
  #5 (permalink)  
Старый 03.01.2020, 19:40
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 01.07.2017
Сообщений: 25

Это первый раз на моей практике, когда js расширения как-то отличается от обычного.
Всегда когда юзаешь что-то запрещенное в расширениях, в консоли прямо так и писалось что этого делать нельзя конкретно в расширении. А тут просто молча все глохнет и хоть убейся.
Ответить с цитированием
  #6 (permalink)  
Старый 03.01.2020, 21:20
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,598

Rise, да яб тож так подумал, но массив то у него проходит. Магия.
Xopc11, попробуй более длинный "простой" массив.
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 04.01.2020, 04:57
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 01.07.2017
Сообщений: 25

Без разрешений в манифесте не пройдет любой запрос.
php лежит в папке расширения и генерирует мне $arr = array(1,2,3,4,5); смешно да.

Что касается более длинных запросов...
У меня спокойно проходит вот такой ответ:
(2) [{…}, {…}]
0:
content: {c1: "5", c2: "10", c3: 1}
userInfo:
avatar: "************"
dark: "************"
light: "************"
group: "************"
login: "**********"
__proto__: Object
__proto__: Object
1: {content: {…}, userInfo: {…}}
length: 2
__proto__: Array(0)

Личные данные я закрыл ***. Знаю всем пофиг на них, но как-то не правильно их светить )) На деле там все нормально.
Пока ключи 0,1,2,3... все ок. Но стоит мне поменять ключи и габелла. Допусти сделать не 0 и 1, а Arr0 и Arr1. Или если я положу еще что-то помимо массива с данными пользователей.
Например я хочу чтобы у меня было так ["val1"=>123,"val2"=>321, val3[{...},{...}] ] ну условно... Но тогда сразу error.

Я пока нашел такой выход. Перед тем как отправить конечный массив в json_encode я делаю ключ [0] и в него скидываю все одиночные значения val1 и val2. А уже 1 и 2 ключи хранят то что приходило изначально.

В итоге приходит все также как и в js коде выше, только 0 хранит не content: {…}, userInfo: {…}, а val1:123 и val2:321. Пропускаю 0 и все что дальше обрабатываю как будто это мой val3.

Не знаю понятно ли объяснил... И хорошо ли мое решение, но оно вроде работает. Ничего лучше пока не придумал, да и не знаю даже что можно придумать если элементарно не проходит $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
Ответить с цитированием
  #8 (permalink)  
Старый 04.01.2020, 12:08
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 01.07.2017
Сообщений: 25

Сообщение от Rise Посмотреть сообщение
Мой вывод, что есть какой-то еще код, а не просто, как ты рассказал в постах 1 и 3
Весь код о котором я не рассказал никак не мог повлиять на работу ajax.
Тем более я разумеется отключал вообще все что хоть как-то могло вмешаться.

Но я нашел косяк. Не знаю можно тут у вас материться или нет, но явно в моем случае нужно.
У меня были отключены Warning в консоли...
Cross-Origin Read Blocking (CORB) blocked cross-origin response [url]https://test/[/url] with MIME type text/html. See [url]https://www.chromestatus.com/feature/5629709824032768[/url] for more details.

Последний раз редактировалось Xopc11, 04.01.2020 в 12:20.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при чтении json полученного через ajax ishurgaya Общие вопросы Javascript 7 10.12.2018 09:20
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Отсылаются только цифры: JSON через AJAX xaocbozzz AJAX и COMET 19 27.11.2012 10:53
ajax $.post вместо json проблема данные не приходят Sadist_dead AJAX и COMET 2 12.07.2012 17:59
Ajax и Json callback функция borabora Prototype & script.aculo.us 0 30.01.2012 15:01